home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / winsock / ircii2-6.zip / SRC\IRCII-2.6\SOURCE\NUMBERS.C < prev    next >
C/C++ Source or Header  |  1994-12-31  |  18KB  |  758 lines

  1. /*
  2.  * numbers.c:handles all those strange numeric response dished out by that
  3.  * wacky, nutty program we call ircd 
  4.  *
  5.  *
  6.  * written by michael sandrof
  7.  *
  8.  * copyright(c) 1990 
  9.  *
  10.  * see the copyright file, or do a help ircii copyright 
  11.  */
  12.  
  13. #ifndef lint
  14. static    char    rcsid[] = "@(#)$Id: numbers.c,v 1.15 1994/07/02 02:32:13 mrg Stab $";
  15. #endif
  16.  
  17. #include "irc.h"
  18.  
  19. #include "input.h"
  20. #include "ircaux.h"
  21. #include "vars.h"
  22. #include "lastlog.h"
  23. #include "hook.h"
  24. #include "server.h"
  25. #include "whois.h"
  26. #include "numbers.h"
  27. #include "window.h"
  28. #include "screen.h"
  29. #include "output.h"
  30. #include "names.h"
  31. #include "whois.h"
  32. #include "funny.h"
  33. #include "parse.h"
  34.  
  35. extern    void    got_initial_version();
  36. extern  int     check_screen_redirect();
  37. extern  int     check_wait_command();
  38.  
  39. static    int    already_doing_reset_nickname = 0;
  40.  
  41. /*
  42.  * numeric_banner: This returns in a static string of either "xxx" where
  43.  * xxx is the current numeric, or "***" if SHOW_NUMBERS is OFF 
  44.  */
  45. char    *
  46. numeric_banner()
  47. {
  48.     static    char    thing[4];
  49.  
  50.     if (get_int_var(SHOW_NUMERICS_VAR))
  51.         sprintf(thing, "%3.3u", -current_numeric);
  52.     else
  53.         strcpy(thing, "***");
  54.     return (thing);
  55. }
  56.  
  57.  
  58. /*
  59.  * display_msg: handles the displaying of messages from the variety of
  60.  * possible formats that the irc server spits out.  you'd think someone would
  61.  * simplify this 
  62.  */
  63. void
  64. display_msg(from, ArgList)
  65.     char    *from,
  66.         **ArgList;
  67. {
  68.     char    *ptr;
  69.     char    *rest;
  70.  
  71.     rest = PasteArgs(ArgList, 0);
  72.     if (from && (my_strnicmp(get_server_itsname(from_server), from,
  73.             strlen(get_server_itsname(from_server))) == 0))
  74.         from = (char *) 0;
  75.     if ((ptr = (char *) index(rest, ':')) != NULL)
  76.     {
  77.         *(ptr++) = (char) 0;
  78.         if (strlen(rest))
  79.         {
  80.             if (from)
  81.                 put_it("%s %s: %s (from %s)", numeric_banner(),
  82.                     rest, ptr, from);
  83.             else
  84.                 put_it("%s %s: %s", numeric_banner(), rest,
  85.                     ptr);
  86.         }
  87.         else
  88.         {
  89.             if (from)
  90.                 put_it("%s %s (from %s)", numeric_banner(),
  91.                     ptr, from);
  92.             else
  93.                 put_it("%s %s", numeric_banner(), ptr);
  94.         }
  95.     }
  96.     else
  97.     {
  98.         if (from)
  99.             put_it("%s %s (from %s)", numeric_banner(), rest, from);
  100.         else
  101.             put_it("%s %s", numeric_banner(), rest);
  102.     }
  103. }
  104.  
  105. /*
  106.  * password_sendline: called by send_line() in get_password() to handle
  107.  * hitting of the return key, etc 
  108.  */
  109. static    void
  110. password_sendline(data, line)
  111.     char    *data;
  112.     char    *line;
  113. {
  114.     int    new_server;
  115.  
  116.     new_server = atoi(line);
  117.     set_server_password(new_server, line);
  118.     connect_to_server(get_server_name(new_server),
  119.         get_server_port(new_server), -1);
  120. }
  121.  
  122. /*
  123.  * get_password: when a host responds that the user needs to supply a
  124.  * password, it gets handled here!  the user is prompted for a password and
  125.  * then reconnection is attempted with that password.  but, the reality of
  126.  * the situation is that no one really uses user passwords.  ah well 
  127.  */
  128. static    void
  129. get_password()
  130. {
  131.     char    server_num[8];
  132.  
  133.     say("password required for connection to server %s",
  134.         get_server_name(from_server));
  135.     sprintf(server_num, "%d", from_server);
  136.     close_server(from_server, empty_string);
  137.     add_wait_prompt("Server Password:", password_sendline,
  138.         server_num, WAIT_PROMPT_LINE);
  139. }
  140.  
  141. /*ARGSUSED*/
  142. static    void
  143. nickname_sendline(data, nick)
  144.     char    *data;
  145.     char    *nick;
  146. {
  147.     int    new_server, server;
  148.  
  149.     new_server = atoi(data);
  150.     if ((nick = check_nickname(nick)) != NULL)
  151.     {
  152.  
  153.         server = from_server;
  154.         from_server = new_server;
  155.         send_to_server("NICK %s", nick);
  156.         if (new_server == primary_server)
  157.             strmcpy(nickname, nick, NICKNAME_LEN);
  158.         set_server_nickname(new_server, nick);
  159.         from_server = server;
  160.         already_doing_reset_nickname = 0;
  161.         update_all_status();
  162.     }
  163.     else
  164.     {
  165.         say("illegal nickname, try again");
  166.         add_wait_prompt("Nickname: ", nickname_sendline, data,
  167.                 WAIT_PROMPT_LINE);
  168.     }
  169. }
  170.  
  171. /*
  172.  * reset_nickname: when the server reports that the selected nickname is not
  173.  * a good one, it gets reset here. 
  174.  */
  175. void
  176. reset_nickname()
  177. {
  178.     char    server_num[10];
  179.  
  180.     if (already_doing_reset_nickname)
  181.         return;
  182.     already_doing_reset_nickname = 1;
  183.     say("You have specified an illegal nickname");
  184.     say("Please enter your nickname");
  185.     sprintf(server_num, "%d", from_server);
  186.     add_wait_prompt("Nickname: ", nickname_sendline, server_num,
  187.         WAIT_PROMPT_LINE);
  188.     update_all_status();
  189. }
  190.  
  191. /*ARGSUSED*/
  192. static    void
  193. channel_topic(from, ArgList)
  194.     char    *from,
  195.         **ArgList;
  196. {
  197.     char    *topic, *channel;
  198.  
  199.     if (ArgList[1] && is_channel(ArgList[0]))
  200.     {
  201.         topic = ArgList[1];
  202.         channel = ArgList[0];
  203.         message_from(channel, LOG_CRAP);
  204.         put_it("%s Topic for %s: %s", numeric_banner(), channel,
  205.             topic);
  206.     }
  207.     else
  208.     {
  209.         PasteArgs(ArgList, 0);
  210.         message_from((char *) 0, LOG_CURRENT);
  211.         put_it("%s Topic: %s", numeric_banner(), ArgList[0]);
  212.     }
  213. }
  214.  
  215. void
  216. nickname_in_use(from, ArgList)
  217.     char    *from,
  218.         **ArgList;
  219. {
  220.     PasteArgs(ArgList, 0);
  221.     if (is_server_connected(from_server))
  222.         if (do_hook(current_numeric, "%s", *ArgList))
  223.             display_msg(from, ArgList);
  224.     else if (never_connected || from_server != primary_server ||
  225.         !attempting_to_connect)
  226.     {
  227.         if (do_hook(current_numeric, "%s", *ArgList))
  228.             display_msg(from, ArgList);
  229.         reset_nickname();
  230.     }
  231.     else
  232.     {
  233.         send_to_server("USER %s %s . :%s", username,
  234.             (send_umode && *send_umode) ? send_umode : ".",
  235.             realname);
  236.         send_to_server("NICK %s", get_server_nickname(from_server));
  237.     }
  238. }
  239.  
  240. static    void
  241. not_valid_channel(from, ArgList)
  242.     char    *from,
  243.         **ArgList;
  244. {
  245.     char    *channel;
  246.     char    *s;
  247.  
  248.     if (!(channel = ArgList[0]) || !ArgList[1])
  249.         return;
  250.     PasteArgs(ArgList, 1);
  251.     s = get_server_name(from_server);
  252.     if (0 == my_strnicmp(s, from, strlen(s)))
  253.     {
  254.         remove_channel(channel, from_server);
  255.         put_it("%s %s %s", numeric_banner(), channel, ArgList[1]);
  256.     }
  257. }
  258.  
  259. /* from ircd .../include/numeric.h */
  260. /*
  261. #define ERR_CHANNELISFULL    471
  262. #define ERR_INVITEONLYCHAN   473
  263. #define ERR_BANNEDFROMCHAN   474
  264. #define ERR_BADCHANNELKEY    475
  265. #define ERR_BADCHANMASK      476
  266. */
  267. static    void
  268. cannot_join_channel(from, ArgList)
  269.     char    *from,    
  270.         **ArgList;
  271. {
  272.     if (ArgList[0])
  273.         remove_channel(ArgList[0], from_server);
  274.     PasteArgs(ArgList, 0);
  275.     strcpy(buffer, ArgList[0]);
  276.     switch(-current_numeric)
  277.     {
  278.     case 471:
  279.         strcat(buffer, " (Channel is full)");
  280.         break;
  281.     case 473:
  282.         strcat(buffer, " (Invite only channel)");
  283.         break;
  284.     case 474:
  285.         strcat(buffer, " (Banned from channel)");
  286.         break;
  287.     case 475:
  288.         strcat(buffer, " (Bad channel key)");
  289.         break;
  290.     case 476:
  291.         strcat(buffer, " (Bad channel mask)");
  292.         break;
  293.     }
  294.     put_it("%s %s", numeric_banner(), buffer);
  295. }
  296.  
  297.  
  298. /*ARGSUSED*/
  299. static    void
  300. version(from, ArgList)
  301.     char    *from,
  302.         **ArgList;
  303. {
  304.     if (ArgList[2])
  305.     {
  306.         PasteArgs(ArgList, 2);
  307.         put_it("%s Server %s: %s %s", numeric_banner(), ArgList[1],
  308.             ArgList[0], ArgList[2]);
  309.     }
  310.     else
  311.     {
  312.         PasteArgs(ArgList, 1);
  313.         put_it("%s Server %s: %s", numeric_banner(), ArgList[1],
  314.             ArgList[0]);
  315.     }
  316. }
  317.  
  318.  
  319. /*ARGSUSED*/
  320. static    void
  321. invite(from, ArgList)
  322.     char    *from,
  323.         **ArgList;
  324. {
  325.     char    *who,
  326.         *channel;
  327.  
  328.     if ((who = ArgList[0]) && (channel = ArgList[1]))
  329.     {
  330.         message_from(channel, LOG_CRAP);
  331.         if (do_hook(current_numeric, "%s %s %s", from, who, channel))
  332.             put_it("%s Inviting %s to channel %s",
  333.                     numeric_banner(), who, channel);
  334.     }
  335. }
  336.  
  337.  
  338. /*
  339.  * numbered_command: does (hopefully) the right thing with the numbered
  340.  * responses from the server.  I wasn't real careful to be sure I got them
  341.  * all, but the default case should handle any I missed (sorry) 
  342.  */
  343. void
  344. numbered_command(from, comm, ArgList)
  345.     char    *from;
  346.     int    comm;
  347.     char    **ArgList;
  348. {
  349.     char    *user;
  350.     char    none_of_these = 0;
  351.     define_big_buffer(blah);
  352.     int    flag,
  353.         lastlog_level;
  354. #if 0
  355.     int    user_cnt,
  356.         inv_cnt,
  357.         server_cnt;
  358. #endif
  359.  
  360.     if (!*ArgList[0])
  361.         user = (char *) 0;
  362.     else
  363.         user = ArgList[0];
  364.     if (!ArgList[1])
  365.     {
  366.         free_big_buffer(blah);
  367.         return;
  368.     }
  369.     lastlog_level = set_lastlog_msg_level(LOG_CRAP);
  370.     message_from((char *) 0, LOG_CRAP);
  371.     ArgList++;
  372.     current_numeric = -comm;    /* must be negative of numeric! */
  373.     switch (comm)
  374.     {
  375.     case 001:    /* #define RPL_WELCOME          001 */
  376.         PasteArgs(ArgList, 0);
  377.         if (do_hook(current_numeric, "%s %s", from, *ArgList)) 
  378.             display_msg(from, ArgList);
  379.         break;
  380.     case 002:    /* #define RPL_YOURHOST         002 */
  381.         PasteArgs(ArgList, 0);
  382.         sprintf(blah, "*** %s", ArgList[0]);
  383.         got_initial_version(blah);
  384.         if (do_hook(current_numeric, "%s %s", from, *ArgList))
  385.             display_msg(from, ArgList);
  386.         break;
  387.  
  388. /* should do something with this some day, 2.8 had channel/user mode switches */
  389.     case 004:    /* #define RPL_MYINFO           004 */
  390.         PasteArgs(ArgList, 0);
  391.         if (do_hook(current_numeric, "%s %s", from, *ArgList))
  392.             display_msg(from, ArgList);
  393.         break;
  394.  
  395. /*
  396.  * this part of ircii has been broken for most of ircd 2.7, so someday I'll
  397.  * make it work for ircd 2.8 ...  phone..
  398.  */
  399. #if 0
  400.     case 251:        /* #define RPL_LUSERCLIENT      251 */
  401.         display_msg(from, ArgList);
  402.         if (server_list[from_server].connected)
  403.             break;
  404.         if ((from_server == primary_server) && ((sscanf(ArgList[1],
  405.             "There are %d users and %d invisible on %d servers",
  406.             &user_cnt, &inv_cnt, &server_cnt) == 3)||(sscanf(ArgList[1],
  407.             "There are %d users and %d invisible on %d servers",
  408.             &user_cnt, &inv_cnt, &server_cnt) == 3)))
  409.         {
  410.             user_cnt =+ inv_cnt;
  411.             if ((server_cnt < get_int_var(MINIMUM_SERVERS_VAR)) ||
  412.                 (user_cnt < get_int_var(MINIMUM_USERS_VAR)))
  413.             {
  414.                 say("Trying better populated server...");
  415.                 get_connected(from_server + 1);
  416.             }
  417.         }
  418. #endif
  419.     case 301:        /* #define RPL_AWAY             301 */
  420.         user_is_away(from, ArgList);
  421.         break;
  422.  
  423.     case 302:        /* #define RPL_USERHOST         302 */
  424.         userhost_returned(from, ArgList);
  425.         break;
  426.  
  427.     case 303:        /* #define RPL_ISON             303 */
  428.         ison_returned(from, ArgList);
  429.         break;
  430.  
  431.     case 311:        /* #define RPL_WHOISUSER        311 */
  432.         whois_name(from, ArgList);
  433.         break;
  434.  
  435.     case 312:        /* #define RPL_WHOISSERVER      312 */
  436.         whois_server(from, ArgList);
  437.         break;
  438.  
  439.     case 313:        /* #define RPL_WHOISOPERATOR    313 */
  440.         whois_oper(from, ArgList);
  441.         break;
  442.  
  443.     case 314:        /* #define RPL_WHOWASUSER       314 */
  444.         whowas_name(from, ArgList);
  445.         break;
  446.  
  447.     case 316:        /* #define RPL_WHOISCHANOP      316 */
  448.         whois_chop(from, ArgList);
  449.         break;
  450.  
  451.     case 317:        /* #define RPL_WHOISIDLE        317 */
  452.         whois_lastcom(from, ArgList);
  453.         break;
  454.  
  455.     case 318:        /* #define RPL_ENDOFWHOIS       318 */
  456.         end_of_whois(from, ArgList);
  457.         break;
  458.  
  459.     case 319:        /* #define RPL_WHOISCHANNELS    319 */
  460.         whois_channels(from, ArgList);
  461.         break;
  462.  
  463.     case 321:        /* #define RPL_LISTSTART        321 */
  464.         ArgList[0] = "Channel\0Users\0Topic";
  465.         ArgList[1] = ArgList[0] + 8;
  466.         ArgList[2] = ArgList[1] + 6;
  467.         ArgList[3] = (char *) 0;
  468.         funny_list(from, ArgList);
  469.         break;
  470.  
  471.     case 322:        /* #define RPL_LIST             322 */
  472.         funny_list(from, ArgList);
  473.         break;
  474.  
  475.     case 324:        /* #define RPL_CHANNELMODEIS    324 */
  476.         funny_mode(from, ArgList);
  477.         break;
  478.  
  479.     case 341:        /* #define RPL_INVITING         341 */
  480.         invite(from, ArgList);
  481.         break;
  482.  
  483.     case 352:        /* #define RPL_WHOREPLY         352 */
  484.         whoreply((char *) 0, ArgList);
  485.         break;
  486.  
  487.     case 353:        /* #define RPL_NAMREPLY         353 */
  488.         funny_namreply(from, ArgList);
  489.         break;
  490.  
  491.     case 366:        /* #define RPL_ENDOFNAMES       366 */
  492.         {
  493.             int    flag;
  494.  
  495.             PasteArgs(ArgList, 0);
  496.             flag = do_hook(current_numeric, "%s %s", from,
  497.                 ArgList[0]);
  498.         
  499.             if (!funny_is_ignore_channel())
  500.             {
  501.                 if (get_int_var(SHOW_END_OF_MSGS_VAR) && flag)
  502.                     display_msg(from, ArgList);
  503.             }
  504.             else
  505.                 funny_set_ignore_mode();
  506.         }
  507.         break;
  508.  
  509.     case 381:         /* #define RPL_YOUREOPER        381 */
  510.         PasteArgs(ArgList, 0);
  511.         if (do_hook(current_numeric, "%s %s", from, *ArgList))
  512.             display_msg(from, ArgList);
  513.         set_server_operator(from_server, 1);
  514.         set_server_flag(from_server, USER_MODE_S, 1);
  515.         set_server_flag(from_server, USER_MODE_W, 1);
  516.         update_all_status();    /* fix the status line */
  517.         break;
  518.  
  519.     case 401:        /* #define ERR_NOSUCHNICK       401 */
  520.         no_such_nickname(from, ArgList);
  521.         break;
  522.  
  523.     case 421:        /* #define ERR_UNKNOWNCOMMAND   421 */
  524.         if (check_screen_redirect(ArgList[0]))
  525.             break;
  526.         if (check_wait_command(ArgList[0]))
  527.             break;
  528.         PasteArgs(ArgList, 0);
  529.         flag = do_hook(current_numeric, "%s %s", from, *ArgList);
  530.         if (!strncmp("ISON", *ArgList, 4) || !strncmp("USERHOST",
  531.             *ArgList, 8))
  532.         {
  533.             set_server_2_6_2(from_server, 0);
  534.             convert_to_whois(from_server);
  535.         }
  536.         else if (flag)
  537.             display_msg(from, ArgList);
  538.         break;
  539.  
  540.     case 432:        /* #define ERR_ERRONEUSNICKNAME 432 */
  541.         if (do_hook(current_numeric, "%s %s", from, *ArgList))
  542.             display_msg(from, ArgList);
  543.         reset_nickname();
  544.         break;
  545.  
  546.     case 433:        /* #define ERR_NICKNAMEINUSE    433 */ 
  547.         nickname_in_use(from, ArgList);
  548.         reset_nickname();
  549.         break;
  550.  
  551.     case 463:        /* #define ERR_NOPERMFORHOST    463 */
  552.         display_msg(from, ArgList);
  553.         close_server(from_server, empty_string);
  554.         window_check_servers();
  555.         if (from_server == primary_server)
  556.             get_connected(from_server + 1);
  557.         break;
  558.  
  559.     case 464:        /* #define ERR_PASSWDMISMATCH   464 */
  560.         PasteArgs(ArgList, 0);
  561.         flag = do_hook(current_numeric, "%s %s", from, ArgList[0]);
  562.         if (oper_command)
  563.             if (flag)
  564.                 display_msg(from, ArgList);
  565.         else
  566.             get_password();
  567.         break;
  568.  
  569.     case 465:        /* #define ERR_YOUREBANNEDCREEP 465 */
  570.         PasteArgs(ArgList, 0);
  571.         if (do_hook(current_numeric, "%s %s", from, ArgList[0]))
  572.             display_msg(from, ArgList);
  573.         close_server(from_server, empty_string);
  574.         window_check_servers();
  575.         break;
  576.  
  577.             /*
  578.              * The following accumulates the remaining arguments
  579.              * in ArgSpace for hook detection. We can't use
  580.              * PasteArgs here because we still need the arguments
  581.              * separated for use elsewhere.
  582.              */
  583.     default:
  584.         {
  585.             char    *ArgSpace = (char *) 0;
  586.             int    i, len;
  587.  
  588.             for (i = len = 0; ArgList[i]; len +=
  589.                     strlen(ArgList[i++]))
  590.                 ;
  591.             len += (i - 1);
  592.             ArgSpace = new_malloc(len + 1);
  593.             ArgSpace[0] = '\0';
  594.             for (i = 0; ArgList[i]; i++)
  595.             {
  596.                 if (i)
  597.                     strcat(ArgSpace, " ");
  598.                 strcat(ArgSpace, ArgList[i]);
  599.             }
  600.             if (!do_hook(current_numeric, "%s %s", from, ArgSpace))
  601.             {
  602.                 new_free(&ArgSpace);
  603.                 set_lastlog_msg_level(lastlog_level);
  604.                 free_big_buffer(blah);
  605.                 return;
  606.             }
  607.             new_free(&ArgSpace);
  608.             none_of_these = 1;
  609.         }
  610.     }
  611.     /* the following do not hurt the ircII if intercepted by a hook */
  612.     if (none_of_these)
  613.     {
  614.         switch (comm)
  615.         {
  616.         case 221:         /* #define RPL_UMODEIS          221 */
  617.             put_it("%s Your user mode is \"%s\"", numeric_banner(),
  618.                 ArgList[0]);
  619.             break;
  620.  
  621.         case 242:        /* #define RPL_STATSUPTIME      242 */
  622.             PasteArgs(ArgList, 0);
  623.             if (from && !my_strnicmp(get_server_itsname(from_server),
  624.                 from, strlen(get_server_itsname(from_server))))
  625.                 from = NULL;
  626.             if (from)
  627.                 put_it("%s %s from (%s)", numeric_banner(),
  628.                     *ArgList, from);
  629.             else
  630.                 put_it("%s %s", numeric_banner(), *ArgList);
  631.             break;
  632.  
  633.         case 332:        /* #define RPL_TOPIC            332 */
  634.             channel_topic(from, ArgList);
  635.             break;
  636.  
  637.         case 351:        /* #define RPL_VERSION          351 */
  638.             version(from, ArgList);
  639.             break;
  640.  
  641.         case 364:        /* #define RPL_LINKS            364 */
  642.             if (ArgList[2])
  643.             {
  644.                 PasteArgs(ArgList, 2);
  645.                 put_it("%s %-20s %-20s %s", numeric_banner(),
  646.                     ArgList[0], ArgList[1], ArgList[2]);
  647.             }
  648.             else
  649.             {
  650.                 PasteArgs(ArgList, 1);
  651.                 put_it("%s %-20s %s", numeric_banner(),
  652.                     ArgList[0], ArgList[1]);
  653.             }
  654.             break;
  655.  
  656.         case 372:        /* #define RPL_MOTD             372 */
  657.             if (!get_int_var(SUPPRESS_SERVER_MOTD_VAR) ||
  658.                 !get_server_motd(from_server))
  659.             {
  660.                 PasteArgs(ArgList, 0);
  661.                 put_it("%s %s", numeric_banner(), ArgList[0]);
  662.             }
  663.             break;
  664.  
  665.         case 375:        /* #define RPL_MOTDSTART        375 */
  666.             if (!get_int_var(SUPPRESS_SERVER_MOTD_VAR) ||
  667.                 !get_server_motd(from_server))
  668.             {
  669.                 PasteArgs(ArgList, 0);
  670.                 put_it("%s %s", numeric_banner(), ArgList[0]);
  671.             }
  672.             break;
  673.  
  674.         case 376:        /* #define RPL_ENDOFMOTD        376 */
  675.             if (get_int_var(SHOW_END_OF_MSGS_VAR) &&
  676.                 (!get_int_var(SUPPRESS_SERVER_MOTD_VAR) ||
  677.                 !get_server_motd(from_server)))
  678.             {
  679.                 PasteArgs(ArgList, 0);
  680.                 put_it("%s %s", numeric_banner(), ArgList[0]);
  681.             }
  682.             set_server_motd(from_server, 0);
  683.             break;
  684.  
  685.         case 384:        /* #define RPL_MYPORTIS         384 */
  686.             PasteArgs(ArgList, 0);
  687.             put_it("%s %s %s", numeric_banner(), ArgList[0], user);
  688.             break;
  689.  
  690.         case 385:        /* #define RPL_NOTOPERANYMORE   385 */
  691.             set_server_operator(from_server, 0);
  692.             display_msg(from, ArgList);
  693.             update_all_status();
  694.             break;
  695.  
  696.         case 403:        /* #define ERR_NOSUCHCHANNEL    403 */
  697.             not_valid_channel(from, ArgList);
  698.             break;
  699.  
  700.         case 432:        /* #define ERR_ERRONEUSNICKNAME 432 */
  701.             display_msg(from, ArgList);
  702.             reset_nickname();
  703.             break;
  704.  
  705.         case 451:        /* #define ERR_NOTREGISTERED    451 */
  706.     /*
  707.      * Sometimes the server doesn't catch the USER line, so
  708.      * here we send a simplified version again  -lynx 
  709.      */
  710.             send_to_server("USER %s %s . :%s", username,
  711.                 (send_umode && *send_umode) ? send_umode : ".",
  712.                 realname);
  713.             send_to_server("NICK %s",
  714.                 get_server_nickname(from_server));
  715.             break;
  716.  
  717.         case 462:        /* #define ERR_ALREADYREGISTRED 462 */
  718.             send_to_server("NICK %s",
  719.                 get_server_nickname(from_server));
  720.             break;
  721.  
  722.         case 471:        /* #define ERR_CHANNELISFULL    471 */
  723.         case 473:        /* #define ERR_INVITEONLYCHAN   473 */
  724.         case 474:        /* #define ERR_BANNEDFROMCHAN   474 */
  725.         case 475:         /* #define ERR_BADCHANNELKEY    475 */
  726.         case 476:        /* #define ERR_BADCHANMASK      476 */
  727.             cannot_join_channel(from, ArgList);
  728.             break;
  729.  
  730. #define RPL_CLOSEEND         363
  731. #define RPL_SERVLISTEND      235
  732.         case 315:        /* #define RPL_ENDOFWHO         315 */
  733.             if (cannot_open != (char *) 0)
  734.                 yell("Cannot open: %s", cannot_open);
  735.  
  736.         case 323:               /* #define RPL_LISTEND          323 */
  737.             funny_print_widelist();
  738.  
  739.         case 219:        /* #define RPL_ENDOFSTATS       219 */
  740.         case 232:        /* #define RPL_ENDOFSERVICES    232 */
  741.         case 365:        /* #define RPL_ENDOFLINKS       365 */
  742.         case 368:        /* #define RPL_ENDOFBANLIST     368 */
  743.         case 369:        /* #define RPL_ENDOFWHOWAS      369 */
  744.         case 374:        /* #define RPL_ENDOFINFO        374 */
  745. #if 0    /* this case needs special handing - see above */
  746.         case 376:        /* #define RPL_ENDOFMOTD        376 */
  747. #endif
  748.         case 394:        /* #define RPL_ENDOFUSERS       394 */
  749.             if (!get_int_var(SHOW_END_OF_MSGS_VAR))
  750.                 break;
  751.         default:
  752.             display_msg(from, ArgList);
  753.         }
  754.     }
  755.     set_lastlog_msg_level(lastlog_level);
  756.     free_big_buffer(blah);
  757. }
  758.